/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.marcelo.agro.productos.model;

import java.util.List;
import org.marcelo.agro.core.UtilidadesFormatos;
import org.marcelo.agro.core.api.IProductos;
import org.marcelo.agro.entidades.Fabricante;
import org.marcelo.agro.entidades.Pais;
import org.marcelo.agro.entidades.Productos;
import org.marcelo.agro.entidades.Registrante;
import org.marcelo.agro.entidades.TipoPresentacion;
import org.openide.util.Lookup;

/**
 *
 * @author marcelo
 */
public class ProductosModel {
    
    private Productos actual;
    private IProductos ip;
    private String MENSAJE_ERROR="";
    private Boolean changed = false;
    
    public void guardar(){
        try{
            ip.saveOrUpdate(actual);
            changed = false;
        }
        catch(Exception e){
            MENSAJE_ERROR= e.toString();
        }
    }

    public List<TipoPresentacion> getTipoPresentaciones() {
        
        if (tipoPresentacions == null) {
            tipoPresentacions = ip.getTipoPresentaciones();
        }
        return tipoPresentacions;
    }

    public List<Registrante> getRegistrantes() {
        if (registrantesList == null){
            registrantesList = ip.getRegistrantes();
        }
        return registrantesList;
    }

    public List<Pais> getPaises() {
        if (paises == null) {
            paises = ip.getPaises();
        }
        return paises;
    }

    public List<Fabricante> getFabricantes() {
        if (fabricantesList == null) {
            fabricantesList = ip.getFabricantes();
        }
        return fabricantesList;
    }
    
    private List<Fabricante> fabricantesList;
    private List<Registrante> registrantesList;
    private List<Pais> paises;
    private List<TipoPresentacion> tipoPresentacions;
    private static final Double MAX_PRECIO = 9999999999.99;

    
    
        
    
    
     public ProductosModel(Productos productos) {
         if (productos!= null)
             actual = productos;
         else 
             actual = new Productos();
         ip = Lookup.getDefault().lookup(IProductos.class);
     }
    

    public void setToxicidad(String toxicidad) {
//        if (!actual.getToxicidad().equals(toxicidad)) {
            actual.setToxicidad(toxicidad);
//            if (!changed) 
//                changed = true;
//        }
    }

    public void setTipoPresentacion(Object tipoPresentacion) {
        if (tipoPresentacion instanceof TipoPresentacion){
//            if (!actual.getTipoPresentacion().equals(tipoPresentacion)){
                actual.setTipoPresentacion((TipoPresentacion)tipoPresentacion);
//                if (!changed) 
//                    changed = true;            
//            }
        }
    }

    public void setRegistrante(Object registrante) {
        if (registrante instanceof Registrante){
//            if (!actual.getRegistrante().equals(registrante)){
                actual.setRegistrante((Registrante)registrante);
//                if (!changed) 
//                    changed = true;
//            }
        }
    }

    public void setPrecio(Object precio) {
        Double valor = 0.0;
        if (precio instanceof Double){
            valor = (Double) precio;
        }
        if (precio instanceof String) {
          valor =  UtilidadesFormatos.getInstance().str2Double((String) precio);
//          actual.setPrecio(valor);
        }
        if (valor.compareTo(MAX_PRECIO) <= 0) {
            
            if (actual.getPrecio()!=null && actual.getPrecio().compareTo(valor) != 0){
                actual.setPrecio(valor);
                if (!changed) 
                    changed = true;
            }
        }
    }

    public void setPaisOrigen(Object paisOrigen) {
        if (paisOrigen instanceof Pais){
//            if (!actual.getPaisOrigen().equals(paisOrigen)){
                actual.setPaisOrigen((Pais)paisOrigen);
//                if (!changed) 
//                    changed = true;
//            }
        }
    }

    public void setNombre(String nombre) {
        if (!UtilidadesFormatos.getInstance().isEmpty(nombre) && nombre.length() < 1024) {
//            if (!actual.getNombre().equals(nombre)){
                actual.setNombre(nombre.toUpperCase());
//                if (!changed) {
//                    changed = true;
//                }
//            }
        }
    }

    public void setFabricante(Object fabricante) {
        if (fabricante instanceof Fabricante){
            actual.setFabricante((Fabricante)fabricante);
        }
    }

    public String getToxicidad() {
        return actual.getToxicidad();
    }

    public TipoPresentacion getTipoPresentacion() {
        return actual.getTipoPresentacion();
    }

    public Registrante getRegistrante() {
        return actual.getRegistrante();
    }

    public Double getPrecio() {
        if (actual.getPrecio() != null){
            return actual.getPrecio();
        }
        return 0.0;
    }

    public Pais getPaisOrigen() {
        return actual.getPaisOrigen();
    }

    public String getNombre() {
        return actual.getNombre();
    }

    public Fabricante getFabricante() {
        return actual.getFabricante();
    }

    public boolean isEnableGuardar() {
        
        return !(actual.getNombre() == null || actual.getNombre().isEmpty() );
    }

    public boolean isEnableAgregarMas() {
        return isEnableGuardar();
    }

    /**
     * Metodo para guardar el objeto actual y crear uno
     * nuevo para agregarlo mas tarde
     * 
     */
    public void agregarMas() {
        if(changed){
            guardar();
        }
        actual = new Productos();
    }

    /**
     * Metodo para obtener el mensaje de error
     * @return 
     */
    public String getMensajeError() {
       return MENSAJE_ERROR;
    }

    /**
     * Metodo para saber si hay un mensaje de error disponible para ser mostrado
     * @return 
     */
    public boolean haveError() {
        return MENSAJE_ERROR.isEmpty();
    }
    
    /**
     * Metodo para saber si se realizaron cambios en el modelo
     * @return 
     */
    public boolean changed() {
        return changed;
    }

    public void refresh() {
        if (actual.getId() != null)
            ip.refreshObject(actual);
        changed = false;
    }
    
    
    
}
